Introduction

The Data Set explores AirBnB Prices in Austin.

The Data

sessionInfo(package=NULL)
setwd(dir = "../00 Doc/")
source("../01 Data/ETL_listings.R")
summary(df)

##        id                                       name          host_id    
##  1001400:   1   East Austin Bungalow              :   6   4641823 : 127  
##  1002993:   1   East Austin Home                  :   4   31148752:  42  
##  1003316:   1   Euro Hostel/Dorm Style by Downtown:   4   8167447 :  26  
##  1003775:   1   Charming East Austin Bungalow     :   3   579290  :  18  
##  1009806:   1   East Austin Charmer               :   3   1488733 :  17  
##  1011620:   1   1 bedroom with private bath       :   2   1568741 :  15  
##  (Other):5829   (Other)                           :5813   (Other) :5590  
##    host_name    neighbourhood_group neighbourhood              latitude   
##  Erica  : 135   NA's:5835           78704  :1601   30.1305163587544:   1  
##  John   :  56                       78702  : 797   30.1399214304874:   1  
##  Sarah  :  51                       78703  : 419   30.1406878366631:   1  
##  Michael:  49                       78741  : 414   30.1415093891488:   1  
##  Ryan   :  45                       78745  : 328   30.1423321194423:   1  
##  (Other):5206                       78751  : 251   30.1424347881363:   1  
##  NA's   : 293                       (Other):2025   (Other)         :5829  
##              longitude              room_type        price     
##  -5.09368239448111:   1   Entire home/apt:4060   150    : 253  
##  -97.5670481812431:   1   Private room   :1652   200    : 227  
##  -97.586245659854 :   1   Shared room    : 123   250    : 203  
##  -97.5877635840428:   1                          300    : 181  
##  -97.6136226010006:   1                          100    : 175  
##  -97.6180279594552:   1                          125    : 156  
##  (Other)          :5829                          (Other):4640  
##  minimum_nights number_of_reviews     last_review   reviews_per_month
##  1      :2776   0      :2006      2015-10-26: 260   1      : 211     
##  2      :2005   1      : 698      2015-10-12: 215   0.13   : 194     
##  3      : 690   2      : 452      2015-10-25: 187   0.25   :  79     
##  4      : 147   3      : 302      2015-11-02: 177   2      :  77     
##  5      :  88   4      : 275      2015-10-27: 166   0.05   :  65     
##  7      :  43   5      : 186      (Other)   :2824   (Other):3201     
##  (Other):  86   (Other):1916      NA's      :2006   NA's   :2008     
##  calculated_host_listings_count availability_365
##  1      :4169                   365    :1236    
##  2      : 823                   364    : 268    
##  3      : 232                   363    : 203    
##  7      : 169                   0      :  92    
##  4      : 152                   362    :  80    
##  6      :  62                   361    :  71    
##  (Other): 228                   (Other):3885

Instruction to Reproduce

  • Download the AirBnb data from data.world, search for “KurtAKranz” and download the dataset named “S17 DV Final Project.”

  • We ran a ETL script that standardized the data from “01 Data” folder. It standardized the colomn data to be consistent among all data points.

  • From that, we used Tableau’s Data connector to connect to our data set in data.world.

  • We created 6 different visualizations using Boxplots, Scatter Plots, Histrograms, Crosstabs, and Barcharts.

  • Our first visualization, we showed a crosstab using zip code and room type, with a key performance idicator of average price. We also created parameters that effectively let one select a price range for acceptable locations.

  • Our second visualization, we showed each zip code’s deviation from the average price among all zip codes. From this, we created a set of the top 5 most pricey zip codes.

  • Our third visualization, we showed the average price of each room type, grouped by zipcode. For each room type, we had a reference line showing the average price of each room type.

  • Our fourth visualization, we created a histogram using the average price to convey that the data is skewed right. This means that using the mean to calculate the average is not going to be as accurate as using the median.

  • Our fifth visualization was Population Vs Average Price where we created a join between the census data and then created a scatter plot with neighbourhood as the coloumns and AVG(Population) and AGG(Average Price) as the rows. We then added a trend line to convey the data’s negetive trend.

  • Our sixth and final visualization, we created a boxplot for the prices of the top 5 most pricey zip codes. This showed the outliars in the data, showing again that the median is the better way to express the average.

  • For our shiny visualizations, we created data frames for each graph we had. We made specifc queries for whatever data we needed. Then we used ggplot to take our data frame and create a ggplot object. From that, we used plotly to express the ggplot data with a more interactive display.

Crosstab with Average Price KPI

  • Crosstab using zip code and room type, with a key performance idicator of average price. Parameters were set at 197 for the low end, and 425 for the high end. Effectively making $197 - $425 someones price range. Values in that range are highlighted green. Values above are red, and values below are blue.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2

Above or Below Average

This shows the releative pricing for each zip code compared to the overall average. This enables comparision for pricing to see if you are paying above the market average.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2

Room Type vs. Price

  • The average price of each room type, grouped by zipcode. For each room type, there is a reference line showing the average price of each room type. This

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2
Above_or_Below Average2
Above_or_Below Average2

Price Histogram

Histogram using the average price to convey that the data is skewed right. This means that using the mean to calculate the average is not going to be as accurate as using the median.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2

Population vs. Average Price

Scatter Plot created using a join between our data and the census data. The trend line’s negative slope indicated that the average price of a zip code decreases as the population of the zip code increases.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2

Top 5 Most Pricey Zip Codes

Boxplot for the prices of the top 5 most pricey zip codes. This showed the outliars in the data, showing again that the median is the better way to express the average.

Tableau

Above_or_Below Average

Shiny

Above_or_Below Average2

Price Density Map

A map of Austin zip codes and the average price associated with each area. The red areas are zip codes with prices above the city’s average, the blue areas are zip codes with price being below the city’s average.

Tableau

Above_or_Below Average
LS0tDQp0aXRsZTogIjxjZW50ZXI+PGI+RmluYWwgUHJvamVjdDwvYj48L2NlbnRlcj4iDQphdXRob3I6ICI8Y2VudGVyPjxiPkRhbmllbCBTdHJvZSwgS3VydCBLcmFueiwgQm9uZ2FuaSBNYmlnaTwvYj48L2NlbnRlcj4iDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgaHRtbF9ub3RlYm9vazoNCiAgICB0b2M6IHllcw0KLS0tDQoNCiMqKkludHJvZHVjdGlvbioqDQpUaGUgRGF0YSBTZXQgZXhwbG9yZXMgW0FpckJuQiBQcmljZXMgaW4gQXVzdGluXShodHRwczovL2RhdGEud29ybGQva3VydGFrcmFuei9zLTE3LWR2LWZpbmFsLXByb2plY3QpLiANCg0KIyoqVGhlIERhdGEqKg0KDQpgYGB7ciBzZXNzaW9uSW5mb30NCnNlc3Npb25JbmZvKHBhY2thZ2U9TlVMTCkNCmBgYA0KDQpgYGB7cn0NCnNldHdkKGRpciA9ICIuLi8wMCBEb2MvIikNCnNvdXJjZSgiLi4vMDEgRGF0YS9FVExfbGlzdGluZ3MuUiIpDQpzdW1tYXJ5KGRmKQ0KYGBgDQoNCmBgYA0KDQojIyAgICAgICAgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICAgICAgICAgIGhvc3RfaWQgICAgDQojIyAgMTAwMTQwMDogICAxICAgRWFzdCBBdXN0aW4gQnVuZ2Fsb3cgICAgICAgICAgICAgIDogICA2ICAgNDY0MTgyMyA6IDEyNyAgDQojIyAgMTAwMjk5MzogICAxICAgRWFzdCBBdXN0aW4gSG9tZSAgICAgICAgICAgICAgICAgIDogICA0ICAgMzExNDg3NTI6ICA0MiAgDQojIyAgMTAwMzMxNjogICAxICAgRXVybyBIb3N0ZWwvRG9ybSBTdHlsZSBieSBEb3dudG93bjogICA0ICAgODE2NzQ0NyA6ICAyNiAgDQojIyAgMTAwMzc3NTogICAxICAgQ2hhcm1pbmcgRWFzdCBBdXN0aW4gQnVuZ2Fsb3cgICAgIDogICAzICAgNTc5MjkwICA6ICAxOCAgDQojIyAgMTAwOTgwNjogICAxICAgRWFzdCBBdXN0aW4gQ2hhcm1lciAgICAgICAgICAgICAgIDogICAzICAgMTQ4ODczMyA6ICAxNyAgDQojIyAgMTAxMTYyMDogICAxICAgMSBiZWRyb29tIHdpdGggcHJpdmF0ZSBiYXRoICAgICAgIDogICAyICAgMTU2ODc0MSA6ICAxNSAgDQojIyAgKE90aGVyKTo1ODI5ICAgKE90aGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIDo1ODEzICAgKE90aGVyKSA6NTU5MCAgDQojIyAgICBob3N0X25hbWUgICAgbmVpZ2hib3VyaG9vZF9ncm91cCBuZWlnaGJvdXJob29kICAgICAgICAgICAgICBsYXRpdHVkZSAgIA0KIyMgIEVyaWNhICA6IDEzNSAgIE5BJ3M6NTgzNSAgICAgICAgICAgNzg3MDQgIDoxNjAxICAgMzAuMTMwNTE2MzU4NzU0NDogICAxICANCiMjICBKb2huICAgOiAgNTYgICAgICAgICAgICAgICAgICAgICAgIDc4NzAyICA6IDc5NyAgIDMwLjEzOTkyMTQzMDQ4NzQ6ICAgMSAgDQojIyAgU2FyYWggIDogIDUxICAgICAgICAgICAgICAgICAgICAgICA3ODcwMyAgOiA0MTkgICAzMC4xNDA2ODc4MzY2NjMxOiAgIDEgIA0KIyMgIE1pY2hhZWw6ICA0OSAgICAgICAgICAgICAgICAgICAgICAgNzg3NDEgIDogNDE0ICAgMzAuMTQxNTA5Mzg5MTQ4ODogICAxICANCiMjICBSeWFuICAgOiAgNDUgICAgICAgICAgICAgICAgICAgICAgIDc4NzQ1ICA6IDMyOCAgIDMwLjE0MjMzMjExOTQ0MjM6ICAgMSAgDQojIyAgKE90aGVyKTo1MjA2ICAgICAgICAgICAgICAgICAgICAgICA3ODc1MSAgOiAyNTEgICAzMC4xNDI0MzQ3ODgxMzYzOiAgIDEgIA0KIyMgIE5BJ3MgICA6IDI5MyAgICAgICAgICAgICAgICAgICAgICAgKE90aGVyKToyMDI1ICAgKE90aGVyKSAgICAgICAgIDo1ODI5ICANCiMjICAgICAgICAgICAgICBsb25naXR1ZGUgICAgICAgICAgICAgIHJvb21fdHlwZSAgICAgICAgcHJpY2UgICAgIA0KIyMgIC01LjA5MzY4MjM5NDQ4MTExOiAgIDEgICBFbnRpcmUgaG9tZS9hcHQ6NDA2MCAgIDE1MCAgICA6IDI1MyAgDQojIyAgLTk3LjU2NzA0ODE4MTI0MzE6ICAgMSAgIFByaXZhdGUgcm9vbSAgIDoxNjUyICAgMjAwICAgIDogMjI3ICANCiMjICAtOTcuNTg2MjQ1NjU5ODU0IDogICAxICAgU2hhcmVkIHJvb20gICAgOiAxMjMgICAyNTAgICAgOiAyMDMgIA0KIyMgIC05Ny41ODc3NjM1ODQwNDI4OiAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMCAgICA6IDE4MSAgDQojIyAgLTk3LjYxMzYyMjYwMTAwMDY6ICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwICAgIDogMTc1ICANCiMjICAtOTcuNjE4MDI3OTU5NDU1MjogICAxICAgICAgICAgICAgICAgICAgICAgICAgICAxMjUgICAgOiAxNTYgIA0KIyMgIChPdGhlcikgICAgICAgICAgOjU4MjkgICAgICAgICAgICAgICAgICAgICAgICAgIChPdGhlcik6NDY0MCAgDQojIyAgbWluaW11bV9uaWdodHMgbnVtYmVyX29mX3Jldmlld3MgICAgIGxhc3RfcmV2aWV3ICAgcmV2aWV3c19wZXJfbW9udGgNCiMjICAxICAgICAgOjI3NzYgICAwICAgICAgOjIwMDYgICAgICAyMDE1LTEwLTI2OiAyNjAgICAxICAgICAgOiAyMTEgICAgIA0KIyMgIDIgICAgICA6MjAwNSAgIDEgICAgICA6IDY5OCAgICAgIDIwMTUtMTAtMTI6IDIxNSAgIDAuMTMgICA6IDE5NCAgICAgDQojIyAgMyAgICAgIDogNjkwICAgMiAgICAgIDogNDUyICAgICAgMjAxNS0xMC0yNTogMTg3ICAgMC4yNSAgIDogIDc5ICAgICANCiMjICA0ICAgICAgOiAxNDcgICAzICAgICAgOiAzMDIgICAgICAyMDE1LTExLTAyOiAxNzcgICAyICAgICAgOiAgNzcgICAgIA0KIyMgIDUgICAgICA6ICA4OCAgIDQgICAgICA6IDI3NSAgICAgIDIwMTUtMTAtMjc6IDE2NiAgIDAuMDUgICA6ICA2NSAgICAgDQojIyAgNyAgICAgIDogIDQzICAgNSAgICAgIDogMTg2ICAgICAgKE90aGVyKSAgIDoyODI0ICAgKE90aGVyKTozMjAxICAgICANCiMjICAoT3RoZXIpOiAgODYgICAoT3RoZXIpOjE5MTYgICAgICBOQSdzICAgICAgOjIwMDYgICBOQSdzICAgOjIwMDggICAgIA0KIyMgIGNhbGN1bGF0ZWRfaG9zdF9saXN0aW5nc19jb3VudCBhdmFpbGFiaWxpdHlfMzY1DQojIyAgMSAgICAgIDo0MTY5ICAgICAgICAgICAgICAgICAgIDM2NSAgICA6MTIzNiAgICANCiMjICAyICAgICAgOiA4MjMgICAgICAgICAgICAgICAgICAgMzY0ICAgIDogMjY4ICAgIA0KIyMgIDMgICAgICA6IDIzMiAgICAgICAgICAgICAgICAgICAzNjMgICAgOiAyMDMgICAgDQojIyAgNyAgICAgIDogMTY5ICAgICAgICAgICAgICAgICAgIDAgICAgICA6ICA5MiAgICANCiMjICA0ICAgICAgOiAxNTIgICAgICAgICAgICAgICAgICAgMzYyICAgIDogIDgwICAgIA0KIyMgIDYgICAgICA6ICA2MiAgICAgICAgICAgICAgICAgICAzNjEgICAgOiAgNzEgICAgDQojIyAgKE90aGVyKTogMjI4ICAgICAgICAgICAgICAgICAgIChPdGhlcik6Mzg4NQ0KDQpgYGANCg0KDQoNCkluc3RydWN0aW9uIHRvIFJlcHJvZHVjZQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSBEb3dubG9hZCB0aGUgQWlyQm5iIGRhdGEgZnJvbSBkYXRhLndvcmxkLCBzZWFyY2ggZm9yICJLdXJ0QUtyYW56IiBhbmQgZG93bmxvYWQgdGhlIGRhdGFzZXQgbmFtZWQgIlMxNyBEViBGaW5hbCBQcm9qZWN0LiINCg0KLSBXZSByYW4gYSBFVEwgc2NyaXB0IHRoYXQgc3RhbmRhcmRpemVkIHRoZSBkYXRhIGZyb20gIjAxIERhdGEiIGZvbGRlci4gSXQgc3RhbmRhcmRpemVkIHRoZSBjb2xvbW4gZGF0YSB0byBiZSBjb25zaXN0ZW50IGFtb25nIGFsbCBkYXRhIHBvaW50cy4NCg0KLSBGcm9tIHRoYXQsIHdlIHVzZWQgVGFibGVhdSdzIERhdGEgY29ubmVjdG9yIHRvIGNvbm5lY3QgdG8gb3VyIGRhdGEgc2V0IGluIGRhdGEud29ybGQuDQoNCi0gV2UgY3JlYXRlZCA2IGRpZmZlcmVudCB2aXN1YWxpemF0aW9ucyB1c2luZyBCb3hwbG90cywgU2NhdHRlciBQbG90cywgSGlzdHJvZ3JhbXMsIENyb3NzdGFicywgYW5kIEJhcmNoYXJ0cy4NCg0KLSBPdXIgZmlyc3QgdmlzdWFsaXphdGlvbiwgd2Ugc2hvd2VkIGEgY3Jvc3N0YWIgdXNpbmcgemlwIGNvZGUgYW5kIHJvb20gdHlwZSwgd2l0aCBhIGtleSBwZXJmb3JtYW5jZSBpZGljYXRvciBvZiBhdmVyYWdlIHByaWNlLiBXZSBhbHNvIGNyZWF0ZWQgcGFyYW1ldGVycyB0aGF0IGVmZmVjdGl2ZWx5IGxldCBvbmUgc2VsZWN0IGEgcHJpY2UgcmFuZ2UgZm9yIGFjY2VwdGFibGUgbG9jYXRpb25zLg0KDQotIE91ciBzZWNvbmQgdmlzdWFsaXphdGlvbiwgd2Ugc2hvd2VkIGVhY2ggemlwIGNvZGUncyBkZXZpYXRpb24gZnJvbSB0aGUgYXZlcmFnZSBwcmljZSBhbW9uZyBhbGwgemlwIGNvZGVzLiBGcm9tIHRoaXMsIHdlIGNyZWF0ZWQgYSBzZXQgb2YgdGhlIHRvcCA1IG1vc3QgcHJpY2V5IHppcCBjb2Rlcy4NCg0KLSBPdXIgdGhpcmQgdmlzdWFsaXphdGlvbiwgd2Ugc2hvd2VkIHRoZSBhdmVyYWdlIHByaWNlIG9mIGVhY2ggcm9vbSB0eXBlLCBncm91cGVkIGJ5IHppcGNvZGUuIEZvciBlYWNoIHJvb20gdHlwZSwgd2UgaGFkIGEgcmVmZXJlbmNlIGxpbmUgc2hvd2luZyB0aGUgYXZlcmFnZSBwcmljZSBvZiBlYWNoIHJvb20gdHlwZS4NCg0KLSBPdXIgZm91cnRoIHZpc3VhbGl6YXRpb24sIHdlIGNyZWF0ZWQgYSBoaXN0b2dyYW0gdXNpbmcgdGhlIGF2ZXJhZ2UgcHJpY2UgdG8gY29udmV5IHRoYXQgdGhlIGRhdGEgaXMgc2tld2VkIHJpZ2h0LiBUaGlzIG1lYW5zIHRoYXQgdXNpbmcgdGhlIG1lYW4gdG8gY2FsY3VsYXRlIHRoZSBhdmVyYWdlIGlzIG5vdCBnb2luZyB0byBiZSBhcyBhY2N1cmF0ZSBhcyB1c2luZyB0aGUgbWVkaWFuLg0KDQotIE91ciBmaWZ0aCB2aXN1YWxpemF0aW9uIHdhcyBQb3B1bGF0aW9uIFZzIEF2ZXJhZ2UgUHJpY2Ugd2hlcmUgd2UgY3JlYXRlZCBhIGpvaW4gYmV0d2VlbiB0aGUgY2Vuc3VzIGRhdGEgYW5kIHRoZW4gY3JlYXRlZCBhIHNjYXR0ZXIgcGxvdCB3aXRoIG5laWdoYm91cmhvb2QgYXMgdGhlIGNvbG91bW5zIGFuZCBBVkcoUG9wdWxhdGlvbikgYW5kIEFHRyhBdmVyYWdlIFByaWNlKSBhcyB0aGUgcm93cy4gV2UgdGhlbiBhZGRlZCBhIHRyZW5kIGxpbmUgdG8gY29udmV5IHRoZSBkYXRhJ3MgbmVnZXRpdmUgdHJlbmQuDQoNCi0gT3VyIHNpeHRoIGFuZCBmaW5hbCB2aXN1YWxpemF0aW9uLCB3ZSBjcmVhdGVkIGEgYm94cGxvdCBmb3IgdGhlIHByaWNlcyBvZiB0aGUgdG9wIDUgbW9zdCBwcmljZXkgemlwIGNvZGVzLiBUaGlzIHNob3dlZCB0aGUgb3V0bGlhcnMgaW4gdGhlIGRhdGEsIHNob3dpbmcgYWdhaW4gdGhhdCB0aGUgbWVkaWFuIGlzIHRoZSBiZXR0ZXIgd2F5IHRvIGV4cHJlc3MgdGhlIGF2ZXJhZ2UuDQoNCi0gRm9yIG91ciBzaGlueSB2aXN1YWxpemF0aW9ucywgd2UgY3JlYXRlZCBkYXRhIGZyYW1lcyBmb3IgZWFjaCBncmFwaCB3ZSBoYWQuIFdlIG1hZGUgc3BlY2lmYyBxdWVyaWVzIGZvciB3aGF0ZXZlciBkYXRhIHdlIG5lZWRlZC4gVGhlbiB3ZSB1c2VkIGdncGxvdCB0byB0YWtlIG91ciBkYXRhIGZyYW1lIGFuZCBjcmVhdGUgYSBnZ3Bsb3Qgb2JqZWN0LiBGcm9tIHRoYXQsIHdlIHVzZWQgcGxvdGx5IHRvIGV4cHJlc3MgdGhlIGdncGxvdCBkYXRhIHdpdGggYSBtb3JlIGludGVyYWN0aXZlIGRpc3BsYXkuICANCg0KDQoNCiMjW1NoaW55IEFwcF0oaHR0cHM6Ly9rdXJ0YWtyYW56LnNoaW55YXBwcy5pby9haXJibmJfYXVzdGluLykgDQoNCg0KQ3Jvc3N0YWIgd2l0aCBBdmVyYWdlIFByaWNlIEtQSQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gQ3Jvc3N0YWIgdXNpbmcgemlwIGNvZGUgYW5kIHJvb20gdHlwZSwgd2l0aCBhIGtleSBwZXJmb3JtYW5jZSBpZGljYXRvciBvZiBhdmVyYWdlIHByaWNlLiBQYXJhbWV0ZXJzIHdlcmUgc2V0IGF0IDE5NyBmb3IgdGhlIGxvdyBlbmQsIGFuZCA0MjUgZm9yIHRoZSBoaWdoIGVuZC4gRWZmZWN0aXZlbHkgbWFraW5nICQxOTcgLSAkNDI1IHNvbWVvbmVzIHByaWNlIHJhbmdlLiBWYWx1ZXMgaW4gdGhhdCByYW5nZSBhcmUgaGlnaGxpZ2h0ZWQgZ3JlZW4uIFZhbHVlcyBhYm92ZSBhcmUgcmVkLCBhbmQgdmFsdWVzIGJlbG93IGFyZSBibHVlLg0KDQojIyNUYWJsZWF1DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvY3Jvc3N0YWIucG5nKTwvY2VudGVyPg0KIyMjU2hpbnkNCjxjZW50ZXI+IVtBYm92ZV9vcl9CZWxvdyBBdmVyYWdlMl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvY3Jvc3N0YWJfc2hpbnkucG5nKTwvY2VudGVyPg0KDQoNCkFib3ZlIG9yIEJlbG93IEF2ZXJhZ2UNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpUaGlzIHNob3dzIHRoZSByZWxlYXRpdmUgcHJpY2luZyBmb3IgZWFjaCB6aXAgY29kZSBjb21wYXJlZCB0byB0aGUgb3ZlcmFsbCBhdmVyYWdlLiBUaGlzIGVuYWJsZXMgY29tcGFyaXNpb24gZm9yIHByaWNpbmcgdG8gc2VlIGlmIHlvdSBhcmUgcGF5aW5nIGFib3ZlIHRoZSBtYXJrZXQgYXZlcmFnZS4NCg0KDQojIyNUYWJsZWF1DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvYWJvdmVfb3JfYmVsb3dfYXZlcmFnZS5wbmcpPC9jZW50ZXI+DQojIyNTaGlueQ0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2UyXSguLi8wMyBWaXN1YWxpemF0aW9ucy9hYm92ZV9vcl9iZWxvd19hdmVyYWdlX3NoaW55LnBuZyk8L2NlbnRlcj4NCg0KDQoNCg0KUm9vbSBUeXBlIHZzLiBQcmljZQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi0gVGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgZWFjaCByb29tIHR5cGUsIGdyb3VwZWQgYnkgemlwY29kZS4gRm9yIGVhY2ggcm9vbSB0eXBlLCB0aGVyZSBpcyBhIHJlZmVyZW5jZSBsaW5lIHNob3dpbmcgdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgZWFjaCByb29tIHR5cGUuIFRoaXMgDQoNCiMjI1RhYmxlYXUNCjxjZW50ZXI+IVtBYm92ZV9vcl9CZWxvdyBBdmVyYWdlXSguLi8wMyBWaXN1YWxpemF0aW9ucy9yb29tX3R5cGVfcHJpY2UucG5nKTwvY2VudGVyPg0KIyMjU2hpbnkNCjxjZW50ZXI+IVtBYm92ZV9vcl9CZWxvdyBBdmVyYWdlMl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvcm9vbV90eXBlX3ByaWNlX3NoaW55MS5wbmcpPC9jZW50ZXI+DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZTJdKC4uLzAzIFZpc3VhbGl6YXRpb25zL3Jvb21fdHlwZV9wcmljZV9zaGlueTIucG5nKTwvY2VudGVyPg0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2UyXSguLi8wMyBWaXN1YWxpemF0aW9ucy9yb29tX3R5cGVfcHJpY2Vfc2hpbnkzLnBuZyk8L2NlbnRlcj4NCg0KDQoNClByaWNlIEhpc3RvZ3JhbQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkhpc3RvZ3JhbSB1c2luZyB0aGUgYXZlcmFnZSBwcmljZSB0byBjb252ZXkgdGhhdCB0aGUgZGF0YSBpcyBza2V3ZWQgcmlnaHQuIFRoaXMgbWVhbnMgdGhhdCB1c2luZyB0aGUgbWVhbiB0byBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgaXMgbm90IGdvaW5nIHRvIGJlIGFzIGFjY3VyYXRlIGFzIHVzaW5nIHRoZSBtZWRpYW4uDQoNCg0KIyMjVGFibGVhdQ0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2VdKC4uLzAzIFZpc3VhbGl6YXRpb25zL3ByaWNlX2hpc3RvZ3JhbS5wbmcpPC9jZW50ZXI+DQojIyNTaGlueQ0KPGNlbnRlcj4hW0Fib3ZlX29yX0JlbG93IEF2ZXJhZ2UyXSguLi8wMyBWaXN1YWxpemF0aW9ucy9wcmljZV9oaXN0b2dyYW1fc2hpbnkucG5nKTwvY2VudGVyPg0KDQoNCg0KUG9wdWxhdGlvbiB2cy4gQXZlcmFnZSBQcmljZQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClNjYXR0ZXIgUGxvdCBjcmVhdGVkIHVzaW5nIGEgam9pbiBiZXR3ZWVuIG91ciBkYXRhIGFuZCB0aGUgY2Vuc3VzIGRhdGEuIFRoZSB0cmVuZCBsaW5lJ3MgbmVnYXRpdmUgc2xvcGUgaW5kaWNhdGVkIHRoYXQgdGhlIGF2ZXJhZ2UgcHJpY2Ugb2YgYSB6aXAgY29kZSBkZWNyZWFzZXMgYXMgdGhlIHBvcHVsYXRpb24gb2YgdGhlIHppcCBjb2RlIGluY3JlYXNlcy4NCg0KDQojIyNUYWJsZWF1DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvc2NhdHRlcl9wbG90LnBuZyk8L2NlbnRlcj4NCiMjI1NoaW55DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZTJdKC4uLzAzIFZpc3VhbGl6YXRpb25zL3NjYXR0ZXJfcGxvdF9zaGlueS5wbmcpPC9jZW50ZXI+DQoNCg0KDQpUb3AgNSBNb3N0IFByaWNleSBaaXAgQ29kZXMNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpCb3hwbG90IGZvciB0aGUgcHJpY2VzIG9mIHRoZSB0b3AgNSBtb3N0IHByaWNleSB6aXAgY29kZXMuIFRoaXMgc2hvd2VkIHRoZSBvdXRsaWFycyBpbiB0aGUgZGF0YSwgc2hvd2luZyBhZ2FpbiB0aGF0IHRoZSBtZWRpYW4gaXMgdGhlIGJldHRlciB3YXkgdG8gZXhwcmVzcyB0aGUgYXZlcmFnZS4NCg0KDQojIyNUYWJsZWF1DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvYm94X3Bsb3QucG5nKTwvY2VudGVyPg0KIyMjU2hpbnkNCjxjZW50ZXI+IVtBYm92ZV9vcl9CZWxvdyBBdmVyYWdlMl0oLi4vMDMgVmlzdWFsaXphdGlvbnMvYm94X3Bsb3Rfc2hpbnkucG5nKTwvY2VudGVyPg0KDQoNClByaWNlIERlbnNpdHkgTWFwDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KQSBtYXAgb2YgQXVzdGluIHppcCBjb2RlcyBhbmQgdGhlIGF2ZXJhZ2UgcHJpY2UgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYXJlYS4gVGhlIHJlZCBhcmVhcyBhcmUgemlwIGNvZGVzIHdpdGggcHJpY2VzIGFib3ZlIHRoZSBjaXR5J3MgYXZlcmFnZSwgdGhlIGJsdWUgYXJlYXMgYXJlIHppcCBjb2RlcyB3aXRoIHByaWNlIGJlaW5nIGJlbG93IHRoZSBjaXR5J3MgYXZlcmFnZS4NCg0KDQojIyNUYWJsZWF1DQo8Y2VudGVyPiFbQWJvdmVfb3JfQmVsb3cgQXZlcmFnZV0oLi4vMDMgVmlzdWFsaXphdGlvbnMvaGVhdG1hcC5wbmcpPC9jZW50ZXI+DQo=